# 为首页 Echarts 统计数据

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

from sa.models import Project

from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta


class ProjectStatisticsECharts(APIView):
    """12个月各RO项目统计"""

    def post(self, request):
        RO_REGIONS = ['ERO', 'SRO', 'WRO', 'NRO']
        months = request.data.get('monthsList', [])
        # 格式是：['2024-06', '2024-07']
        # print('获取的月分列表：', months)
        # 初始化ECharts需要的数据结构
        series_data = []
        # 为每个RO地区统计数据
        for region in RO_REGIONS:
            region_data = {
                'name': region,
                'data': []
            }
            # 统计该地区每个月的项目数
            for month_str in months:
                # 拆分为 '2024' 和 '06'
                year, month = month_str.split('-')
                count = Project.objects.filter(
                    creator__region=region,
                    start_date__year=int(year),
                    start_date__month=int(month)
                ).count()
                region_data['data'].append(count)
            series_data.append(region_data)

        return Response(data=series_data)


class ProjectCategory(APIView):
    """获取工作分类"""

    def get(self, request):
        # [["故障排除", "故障排除"],["新购实施", "新购实施"],["其它", "其它"]]
        category_choices = Project._meta.get_field('category').choices
        categories = [item[0] for item in category_choices]
        return Response(data=categories)


class ProjectCountByCategory(APIView):
    """ 按工作分类统计数量 """

    def post(self, request):
        # 1.获得分类列表
        category_list = request.data.get('categoryList', [])
        if not category_list:
            return Response(data={
                "error": "categoryList is required"
            }, status=status.HTTP_400_BAD_REQUEST)

        if not isinstance(category_list, list):
            return Response(data={
                'error': '请求数据必须是列列类型！'
            }, status=status.HTTP_400_BAD_REQUEST)

        # 2. 计算一年前的日期
        today = datetime.now()
        # relativedelta 是 Python 的 dateutil 库中提供的一个功能，
        # 用于计算日期/时间的相对差值。
        # 与标准库的 timedelta 不同，
        # relativedelta 可以更灵活地处理年、月、日等单位的加减，甚至可以处理跨月、跨年的复杂情况。
        # 从当前日期减去一年来计算一年前的日期
        one_year_ago = today - relativedelta(years=1)
        # replace方法在Python的datetime模块中用于替换日期或时间对象的某些部分，
        # 而不是字符串。这个方法允许你修改datetime对象中的年、月、日、小时、分钟、秒和微秒等属性。
        # 将一年前的日期设置为该月的第一天
        one_year_ago = one_year_ago.replace(day=1)

        # 3. 初始化并处理 ECharts 需要的数据结构
        series_data = []
        for category in category_list:
            try:
                # print(category, one_year_ago)
                category_count = Project.objects.filter(
                    category=category,
                    start_date__gte=one_year_ago
                ).count()
                # print(f"Category: {category}, Count: {category_count}")
                category_data = {
                    "value": category_count,
                    "name": category
                }
                series_data.append(category_data)
            except Exception as e:
                return Response(
                    data={"error": f"Error counting projects for software {category}: {str(e)}"},
                    status=status.HTTP_500_INTERNAL_SERVER_ERROR
                )

        # print(series_data)
        return Response(data=series_data)


class ProjectSoftware(APIView):
    """ 获取软件类型 """

    def get(self, request):
        software_choices = Project._meta.get_field('software').choices
        software_list = [item[0] for item in software_choices if item[0] is not None]
        return Response(data=software_list)


class ProjectCountBySoftware(APIView):
    """ 根据软件类型进行计数统计 """

    def post(self, request):
        # 1。判读request.data是否直接传的列表
        if not isinstance(request.data, list):
            return Response(data={
                'error': '请求数据必须是列表类型！'
            }, status=status.HTTP_400_BAD_REQUEST)

        # 2.判断是否为空
        software_list = request.data
        if not software_list:
            return Response(data={
                "error": "Software list cannot be empty"
            }, status=status.HTTP_400_BAD_REQUEST)

        # 3.设定统计周期为1年前
        today = datetime.now()
        # 从当前日期减去一年来计算一年前的日期
        one_year_ago = today - relativedelta(years=1)
        # 将一年前的日期设置为该月的第一天
        one_year_ago = one_year_ago.replace(day=1)

        # 4.开始处理 eCharts需要的数据
        series_data = []
        for software in software_list:
            try:
                count = Project.objects.filter(
                    software=software,
                    start_date__gte=one_year_ago
                ).count()
                result = {
                    'name': software,
                    'value': count
                }
                series_data.append(result)
            except Exception as e:
                return Response(
                    data={"error": f"Error counting projects for software {software}: {str(e)}"},
                    status=status.HTTP_500_INTERNAL_SERVER_ERROR
                )
        # print(series_data)
        return Response(data=series_data, status=status.HTTP_200_OK)
